ReverseV2

对输入Tensor按指定维度反转。

输入:
  • src - 需反转数据的地址

  • param - 算子计算所需参数的结构体。其各成员见下述。

  • core_mask - 核掩码(仅共享存储版本使用)。

ReverseParameter定义:

1typedef struct ReverseParameter {
2    int* axis_flag_; // 用于存储需反转的轴,需反转的轴对应于数组索引的元素被置为1,其余元素为0
3    int* input_shape_; // 输入张量的形状
4    int* input_strides_; // 一个记录输入张量每一维步长的数组
5    int** cur_coord_; // 二维数组,每个元素存储对应核心所使用的cur_coord数组地址,这个数组用于记录当前循环到的元素坐标
6    int ndim_; // 输入和输出张量的维度
7    int axis_ndim_; // 需反转的轴的数目
8    int num_elem_; // 元素总数
9} ReverseParameter;
输出:
  • dst - 输出地址。

支持平台:

FT78NE MT7004

备注

  • FT78NE 支持int8, int16, int32, fp32, fp64, cplx64, cplx128

  • MT7004 支持fp16, fp32, int16, int32, cplx64

共享存储版本:

void i8_reverse_s(int8_t *src, int8_t *dst, ReverseParameter *param, int core_mask)
void i16_reverse_s(int16_t *src, int16_t *dst, ReverseParameter *param, int core_mask)
void i32_reverse_s(int32_t *src, int32_t *dst, ReverseParameter *param, int core_mask)
void hp_reverse_s(float16 *src, float16 *dst, ReverseParameter *param, int core_mask)
void fp_reverse_s(float *src, float *dst, ReverseParameter *param, int core_mask)
void dp_reverse_s(double *src, double *dst, ReverseParameter *param, int core_mask)
void c64_reverse_s(float *src, float *dst, ReverseParameter *param, int core_mask)
void c128_reverse_s(double *src, double *dst, ReverseParameter *param, int core_mask)

C调用示例:

 1// MT7004 示例(共享存储多核,DDR 地址)
 2void Resize(ReverseParameter* param, int* axis) {
 3    int i;
 4    param->input_strides_[param->ndim_ - 1] = 1;
 5    for (i = param->ndim_ - 1; i > 0; i--) {
 6        param->input_strides_[i - 1] = param->input_strides_[i] * param->input_shape_[i];
 7    }
 8    for (i = 0; i < param->ndim_; i++) {
 9        // initialize axis_flag array by 0
10        param->axis_flag_[i] = 0;
11    }
12    for (i = 0; i < param->axis_ndim_; i++) {
13        param->axis_flag_[axis[i]] = 1;
14    }
15    param->num_elem_ = 1;
16    for (i = 0; i < param->ndim_; i++) {
17        param->num_elem_ *= param->input_shape_[i];
18    }
19}
20
21void TestReverseV2(int* shape, int ndim, int* axis, int axis_ndim, int core_mask) {
22    int core_num = GetCoreNum(core_mask);
23    int core_id = get_core_id();
24    int logic_core_id = GetLogicCoreId(core_mask, core_id);
25    float* input_data = (float*)0x88000000;
26    float* output_data = (float*)0xA8000000;
27    ReverseParameter* param = (ReverseParameter*)0x84000000;
28    if (logic_core_id == 0) {
29        int i, j;
30        param->axis_ndim_ =  axis_ndim;
31        param->ndim_ = ndim;
32        param->input_shape_ = (int*)0x84003000;
33        for (i = 0; i < ndim; i++) {
34            param->input_shape_[i] = shape[i];
35        }
36        param->input_strides_ = (int*)0x84004000;
37        param->axis_flag_ = (int*)0x84005000;
38        param->cur_coord_ = (int**)0x84006000;
39        for (i = 0; i < 4; i++) {
40            param->cur_coord_[i] = (int*)(0x84007000 + i * 0x1000LL);
41            for (j = 0; j < ndim; j++) {
42                param->cur_coord_[i][j] = 0;
43            }
44        }
45        Resize(param, axis);
46    }
47    sys_bar(0, core_num); // 初始化参数完成后进行同步
48    fp_reverse_s(input_data, output_data, param, core_mask);
49}
50
51void main(){
52    int shape[3] = {10, 10, 1000};
53    int ndim = 3;
54    int axis[3] = {0, 1, 2};
55    int axis_ndim = 3;
56    int core_mask = 0b1111;
57    TestReverseV2(shape, ndim, axis, axis_ndim, core_mask);
58}

私有存储版本:

void i8_reverse_p(int8_t *src, int8_t *dst, ReverseParameter *param)
void i16_reverse_p(int16_t *src, int16_t *dst, ReverseParameter *param)
void i32_reverse_p(int32_t *src, int32_t *dst, ReverseParameter *param)
void hp_reverse_p(float16 *src, float16 *dst, ReverseParameter *param)
void fp_reverse_p(float *src, float *dst, ReverseParameter *param)
void dp_reverse_p(double *src, double *dst, ReverseParameter *param)
void c64_reverse_p(float *src, float *dst, ReverseParameter *param)
void c128_reverse_p(double *src, double *dst, ReverseParameter *param)

C调用示例:

 1// MT7004 示例(私有存储单核,AM 地址)
 2void TestReverseV2_p(int* shape, int ndim, int* axis, int axis_ndim) {
 3    int i, j;
 4    float* input_data = (float*)0x10000000;
 5    float* output_data = (float*)0x10020000;
 6    ReverseParameter* param = (ReverseParameter*)0x10040000;
 7
 8    param->axis_ndim_ = axis_ndim;
 9    param->ndim_ = ndim;
10    param->axis_flag_ = (int*)0x10041000;
11    param->input_shape_ = (int*)0x10041400;
12    param->input_strides_ = (int*)0x10041800;
13    param->cur_coord_ = (int**)0x10041C00;
14    for (i = 0; i < ndim; i++) {
15        param->input_shape_[i] = shape[i];
16    }
17    for (i = 0; i < 4; i++) {
18        param->cur_coord_[i] = (int*)(0x10042000 + i * 0x400LL);
19        for (j = 0; j < ndim; j++) {
20            param->cur_coord_[i][j] = 0;
21        }
22    }
23    Resize(param, axis);
24
25    fp_reverse_p(input_data, output_data, param);
26}
27
28void main(){
29    int shape[3] = {4, 8, 8};
30    int ndim = 3;
31    int axis[3] = {0, 1, 2};
32    int axis_ndim = 3;
33    TestReverseV2_p(shape, ndim, axis, axis_ndim);
34}